const { body } = require('express-validator');
const { Car, User } = require('../../models');
const moment = require('moment');

exports.createOrder = [
    body()
        .custom(async (_, { req }) => {
            const user = await User.findById(req.user.userinfo.id)
                .populate('verification');

            if (!user.isVerified) {
                throw new Error('请先完成实名认证');
            }

            if (!user.verification || !user.verification.signature) {
                throw new Error('请先上传电子签名');
            }

            return true;
        }),

    body('carId')
        .notEmpty().withMessage('车辆ID不能为空').bail()
        .custom(async (value) => {
            const car = await Car.findById(value);
            if (!car) {
                throw new Error('车辆不存在');
            }
            if (car.status !== '可租') {
                throw new Error('该车辆当前不可租用');
            }
            return true;
        }),

    body('startTime')
        .notEmpty().withMessage('开始时间不能为空').bail()
        .custom((value) => {
            const startTime = moment(value);
            if (!startTime.isValid()) {
                throw new Error('开始时间格式不正确');
            }
            if (startTime.isBefore(moment())) {
                throw new Error('开始时间不能早于当前时间');
            }
            return true;
        }),

    body('endTime')
        .notEmpty().withMessage('结束时间不能为空').bail()
        .custom((value, { req }) => {
            const endTime = moment(value);
            const startTime = moment(req.body.startTime);
            if (!endTime.isValid()) {
                throw new Error('结束时间格式不正确');
            }
            if (endTime.isSameOrBefore(startTime)) {
                throw new Error('结束时间必须晚于开始时间');
            }
            return true;
        }),

    body('pickupLocation')
        .notEmpty().withMessage('取车地点不能为空'),

    body('returnLocation')
        .notEmpty().withMessage('还车地点不能为空'),

    body('totalAmount')
        .notEmpty().withMessage('总金额不能为空').bail()
        .isNumeric().withMessage('总金额必须是数字').bail()
        .custom(value => value >= 0).withMessage('总金额不能小于0'),

    body('rentalFee')
        .notEmpty().withMessage('租赁费用不能为空').bail()
        .isNumeric().withMessage('租赁费用必须是数字').bail()
        .custom(value => value >= 0).withMessage('租赁费用不能小于0'),

    body('insuranceFee')
        .optional()
        .isNumeric().withMessage('保险费用必须是数字').bail()
        .custom(value => value >= 0).withMessage('保险费用不能小于0'),

    body('deposit')
        .optional()
        .isNumeric().withMessage('押金必须是数字').bail()
        .custom(value => value >= 0).withMessage('押金不能小于0'),

    body('additionalServices')
        .optional()
        .isArray().withMessage('附加服务必须是数组格式')
];